package com.techindata.cacheredis;

import org.apache.log4j.Logger;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.List;

/**
 * Created by dongbing on 7/22/15.
 */
public class CacheMap {

    static Logger logger = Logger.getLogger(CacheMap.class.getName());
    private int DBINDEX=1;
    private String ROWKEY_PREFIX="";

    /**
     *
     * @param dbindex	选择要操作的库索引（取值范围：0~15，默认为1号库）。
     * @param key_prefix	行键前缀，用于区分不同的应用,只在构造对象时指定。
     */
    public CacheMap(int dbindex,String key_prefix){
        this.DBINDEX=dbindex;
        this.ROWKEY_PREFIX=key_prefix;
    }


    /**
     * 判断是否已经存在指定的行键。
     * @param key
     * @return
     */
    public boolean isExists(String key){
        key=ROWKEY_PREFIX+key;
        JedisPool pool=RedisConnectionPool.getPool();
        Jedis jedis=pool.getResource();
        jedis.select(DBINDEX);
        try{
            return jedis.exists(key);
        }
        catch(Exception e){
            logger.error(e.getMessage(),e);
            return false;
        }
        finally{
            RedisConnectionPool.returnResource(pool, jedis);
        }
    }



    /**
     * 插入一行
     * @param key	行键
     * @param value	值
     * @param expireTime 过期时间
     * @return	操作是否成功
     */
    public boolean add(String key,String value,int expireTime){
        key=ROWKEY_PREFIX+key;
        JedisPool pool=RedisConnectionPool.getPool();
        Jedis jedis=pool.getResource();
        jedis.select(DBINDEX);
        try{
            jedis.rpush(key,value);
            if(expireTime>0){
                jedis.expire(key,expireTime);
            }
            return true;
        }
        catch(Exception e){
            logger.error(e.getMessage(),e);
            return false;
        }
        finally{
            RedisConnectionPool.returnResource(pool, jedis);
        }
    }



    /**
     * 插入一行
     * @param key	行键
     * @param values	值
     * @param expireTime 过期时间
     * @return	操作是否成功
     */
    public boolean add(String key,List<String> values,int expireTime){
        key=ROWKEY_PREFIX+key;
        JedisPool pool=RedisConnectionPool.getPool();
        Jedis jedis=pool.getResource();
        jedis.select(DBINDEX);
        try{
            for(String value:values){
                jedis.rpush(key, value);
                if(expireTime>0){
                    jedis.expire(key,expireTime);
                }
            }
            return true;
        }
        catch(Exception e){
            logger.error(e.getMessage(),e);
            return false;
        }
        finally{
            RedisConnectionPool.returnResource(pool, jedis);
        }
    } 
    

    public long getSize(String key){
        key=ROWKEY_PREFIX+key;
        JedisPool pool=RedisConnectionPool.getPool();
        Jedis jedis=pool.getResource();
        jedis.select(DBINDEX);

        long result=0;
        try{
            result=jedis.llen(key);
            return result;
        }
        catch(Exception e){
            logger.error(e.getMessage(),e);
            return result;
        }
        finally{
            RedisConnectionPool.returnResource(pool, jedis);
        }
    }

    /***
     * 获取指定Index的值
     * @param key
     * @param index （from 0 to getSize()-1）
     * @return
     */
    public String get(String key,int index){
        key=ROWKEY_PREFIX+key;
        JedisPool pool=RedisConnectionPool.getPool();
        Jedis jedis=pool.getResource();
        jedis.select(DBINDEX);

        List<String> result=null;
        try{
            result=jedis.lrange(key,index,index);
            return result.get(0);
        }
        catch(Exception e){
            logger.error(e.getMessage(),e);
            return "";
        }
        finally{
            RedisConnectionPool.returnResource(pool, jedis);
        }
    }


    /***
     * 获取key对应的values集合
     * @param key
     * @return
     */
    public List<String> getAll(String key){
        key=ROWKEY_PREFIX+key;
        JedisPool pool=RedisConnectionPool.getPool();
        Jedis jedis=pool.getResource();
        jedis.select(DBINDEX);

        List<String> result=null;
        try{
            result=jedis.lrange(key, 0, -1);
            return result;
        }
        catch(Exception e){
            logger.error(e.getMessage(),e);
            return result;
        }
        finally{
            RedisConnectionPool.returnResource(pool, jedis);
        }
    }




    /***
     * 删除key对应的values集合
     * @param key
     * @return
     */
    public boolean del(String key){
        key=ROWKEY_PREFIX+key;
        JedisPool pool=RedisConnectionPool.getPool();
        Jedis jedis=pool.getResource();
        jedis.select(DBINDEX);

        try{
            jedis.del(key);
            return true;
        }
        catch(Exception e){
            logger.error(e.getMessage(),e);
            return false;
        }
        finally{
            RedisConnectionPool.returnResource(pool, jedis);
        }
    }


}
